<?php


namespace App\Utils\Tencent;


use App\Utils\Code;

class BizDataCrypt
{
    // 应用ID
    private $appId = null;

    // 应用密钥
    private $sessionKey = null;

    /**
     * 构造函数
     * @param $appId string 小程序的appId
     * @param $sessionKey string 用户在小程序登录后获取的会话密钥
     */
    public function __construct($appId, $sessionKey) {
        $this->appId = $appId;
        $this->sessionKey = $sessionKey;
    }

    /**
     * 检验数据的真实性，并且获取解密后的明文.
     * @param $iv string 与用户数据一同返回的初始向量
     * @param $encryptedData string 加密的用户数据
     *
     * @return mixed
     * @throws \Exception
     */
    public function decryptData($iv, $encryptedData) {
        if (strlen($this->sessionKey) != 24) {
            throw new \Exception('encodingAesKey 非法', Code::PARAMETER_ERROR);
        }
        $aesKey=base64_decode($this->sessionKey);

        if (strlen($iv) != 24) {
            throw new \Exception('iv 非法', Code::PARAMETER_ERROR);
        }
        $aesIV=base64_decode($iv);
        $aesCipher=base64_decode($encryptedData);
        $result=openssl_decrypt( $aesCipher, "AES-128-CBC", $aesKey, 1, $aesIV);
        $dataObj=json_decode( $result );
        if ($dataObj == NULL || $dataObj->watermark->appid != $this->appId) {
            throw new \Exception('aes 解密失败', Code::PARAMETER_ERROR);
        }
        return json_decode($result, true);
    }
}
